package com.autumn.juc.jmm;

/**
 * hsdis-amd64.dll（查看汇编指令）
 * -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp
 * DLC为什么用volatile
 */
public class SingletonFactory {
    private static SingletonFactory myInstance;

    public static SingletonFactory getMyInstance(){
        if (myInstance == null) {
            synchronized (SingletonFactory.class) {
                if (myInstance == null) {
                    /*
                        Java创建对象非原子操作，分三步：
                        ①开辟一块内存空间
                        ②对象初始化
                        ③myInstance指向内存空间的地址
                        其中②③可能发生指令重排，若重排后线程A进行到③，还未进行到②时，线程B获取了myInstances，
                        此时myInstances已经不为null，因此会直接返回，即获取到还未进行初始化的myInstances，引发线程安全问题
                        因此需要使用volatile修饰myInstances
                     */
                    myInstance = new SingletonFactory();
                }
            }
        }
        return myInstance;
    }

    public static void main(String[] args) {
        SingletonFactory.getMyInstance();
    }
}
